Conversation
* 优化 ScriptEditor * Update ScriptEditor.tsx * Update ScriptEditor.tsx * ✨ 调整隐藏编辑框侧边栏位置 #1185 (#1254) * ✨ 调整隐藏编辑框侧边栏位置 #1185 * 图标展示反了 * 调整 `confirm_leave_page` / `script_modified_leave_confirm` 提示避免按「新增脚本」时弹出提示 * Update ScriptEditor.tsx * css 布局修正 * 统一 .focus 为 delayedEditorFocus * 🐛 修复 ScriptEditor review 问题 - 将模块级 cid 变量改为 useRef,避免多实例共享 timer - hotKeys.current.length = 0 改为 hotKeys.current = [],避免原地修改影响旧引用 - handleDeleteEditor 在 setEditors 回调内重新计算 index,修复竞态问题 - 移除冗余的 scriptList.find 查找 - 修复「袑始化」笔误为「初始化」 - 移除重复的 position: absolute 声明 --------- Co-authored-by: wangyizhi <yz@ggnb.top>
rspack build 阶段未转换 manifest.json 中的版本号,导致 "1.4.0-beta" 等非法版本使扩展无法加载,E2E 测试全部失败。 复用 pack.js 中的转换逻辑,在 CopyRspackPlugin transform 中将版本号转为纯数字格式(如 1.4.0.1100)。
将 rspack.config.ts 和 scripts/pack.js 中重复的版本转换逻辑 提取到 scripts/version.js 中复用。
- gm-api.spec.ts: Phase 2 重启 context 后等待 service worker 注册完成 再交给 fixtures,避免 extensionId fixture 用 10s 全局超时等待失败 - gm-api.spec.ts: 用事件驱动 Promise 替换 500ms 轮询循环, console 结果一出现立即继续 - utils.ts: installScriptByCode 用 DOM 事件等待替代固定延迟: click 后等光标出现,粘贴后等 .view-lines 内容变化 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
新增 AI Agent 聊天模块,包括聊天界面、服务层、数据存储和多语言支持
将 Agent API 请求路由到 runtime/gmApi 通道,通过 @PermissionVerify.API 装饰器实现权限验证,脚本首次调用时弹窗确认,防止未授权消耗 API Token。
- 新增 OPFS 文件浏览器页面,支持目录浏览、文件预览和删除操作 - 默认进入 agents/ 目录,支持面包屑导航到根目录 - 支持在 conversation.create 时注册工具,简化多轮对话的工具传递 - 添加 8 种语言的 i18n 翻译
- 修复 callLLM 提前转发 done 事件导致客户端过早 resolve 的问题 - 修复 WindowMessage.connect 未使用 "*" targetOrigin 导致沙箱消息被丢弃 - 修复 tool calling 循环中 assistant 消息缺少 tool_calls 字段 - 支持 OpenAI 和 Anthropic 格式的 tool_calls 消息构建 - UI 合并 tool 结果到 assistant 的 ToolCallBlock 展示,过滤 tool/system 消息 - 提取 buildInstance 函数解决装饰器 this 绑定问题,使用 uuidv4 生成 ID
- ChatMessage 类型新增 usage/durationMs/firstTokenMs 字段 - Service Worker 测量 LLM 调用总耗时并通过 done 事件返回 - UI 层捕获首 token 延迟和 token 用量,持久化到消息中 - 新增 MessageToolbar 组件:左侧操作按钮(复制/重新回答/删除),右侧元数据信息(token用量/耗时/TTFT/工具调用数) - 流式期间显示实时计时动画,完成后切换为最终数据 - 删除操作支持二次确认 - 新增 deleteMessages 批量删除辅助函数 - 添加 i18n 多语言支持(8个locale)
- 新增 CATTool 元数据解析、存储、注册和执行完整链路 - 新增 CAT.agent.tools GM API(install/remove/list/call) - 修复 CATTool 沙箱执行时 args 未定义的问题:使用 compileScriptCodeByResource 包裹代码以启用 with 上下文绑定 - 优化 Agent Chat UI 组件样式
将 App.tsx (~1130行) 按职责拆分为: - utils.ts: 纯工具函数和常量 - hooks.tsx: useInstallData() 自定义 hook - components/CATToolInstallView.tsx: CATTool 安装视图 - components/ScriptInstallView.tsx: UserScript/Subscribe 安装视图 - App.tsx: 精简为路由分发 (~57行)
新增 example/agents/tools/ 目录: - hello_world.js: 最简 CATTool 示例 - text_processor.js: 多参数和 enum 类型 - json_formatter.js: JSON 处理和错误处理 - weather_query.js: GM_xmlhttpRequest 网络请求 - use_cattool.js: 通过脚本 API 安装和调用 CATTool - README.md: 格式说明和测试方法
- 修复历史消息未携带 toolCalls 字段导致多轮 tool calling 上下文丢失 - 添加 OpenAI 流式 API 错误响应处理 - 添加 /new 命令和 clearMessages 接口用于清空对话上下文 - UI 发送消息时正确传递 toolCallId 和 toolCalls
- 删除独立的 handleChat,UI 和 Sandbox 统一走 conversationChat 通道 - 持久化责任从 UI 移交到 SW,简化前端逻辑 - 字段命名统一:createdAt/updatedAt → createtime/updatetime - 支持 UI 动态切换 modelId - 大幅补充 Agent 相关测试(流式解析、tool calling 循环、CATTool 边界等)
- 对话实例支持 / 命令拦截机制,内置 /new 命令清空对话 - 脚本可通过 commands 选项注册自定义命令并覆盖内置命令 - 修复会话列表删除确认弹框因鼠标移开导致隐藏的问题 - 会话 ID 同步到 URL 参数,刷新页面保持当前会话选中 - 新增命令机制 8 个单元测试
- CATTool 安装改为打开安装页面确认,支持脚本来源追踪和更新提示 - CATToolRepo 索引/数据分离(tools.json 索引 + data/<id>.json 完整记录) - CATTool UUID 由 SW 统一生成,通过全局映射支持 GM API 权限验证 - AgentModelConfig 从 SystemConfig 迁移到独立的 AgentModelRepo - AgentModelRepo.getDefaultModelId 使用 chrome.storage.local 直接存取 - cancelCATToolInstall 统一为 try/finally 模式 - openCATToolInstallPage 增加 tab.id 空值检查
实现 Agent 框架的 DOM 操作 API,支持两种模式: - 默认模式:通过 chrome.scripting.executeScript 操作 - trusted 模式:通过 chrome.debugger CDP 实现真实用户输入 新增 8 个 Agent 工具:dom_list_tabs, dom_navigate, dom_read_page, dom_screenshot, dom_click, dom_fill, dom_scroll, dom_wait_for readPage 支持 summary/detail 分层读取,控制上下文大小; 操作后自动返回 ActionResult(跳转/新 tab/dialog 检测); debugger 权限放在 optional_permissions 动态申请。
- 新增 Skill 类型定义(SkillSummary, SkillRecord, SkillApiRequest 等) - SKILL.md 解析器(YAML frontmatter + markdown body) - SkillRepo OPFS 存储(registry + scripts + references) - AgentService 集成:loadSkills, installSkill, resolveSkills - 2 个 meta-tool:execute_skill_tool, read_reference - GM API: CAT.agent.skills(list/get/install/remove) - UI: ChatInput 增加 Skills 选择器
- agent-fixtures.ts: Mock LLM 基础设施(context.route 拦截 + OpenAI SSE 响应) - agent-conversation.spec.ts: 基础对话、Tool Calling、多轮上下文保持 - agent-cattool.spec.ts: CATTool 安装/调用/删除、CATTool + 对话联动
resolveSkills 不再将完整 SKILL.md 正文和 CATTool schema 一次性注入 system message, 改为三层渐进加载:1) 摘要列表 2) load_skill 按需获取 prompt 3) execute_skill_tool/read_reference 按需执行。 execute_skill_tool 新增 skill_name 参数确定工具作用域,CATTool 脚本改为执行时按需加载。 新增 14 个 Skill 系统单元测试。
ephemeral 模式下会话不持久化到 OPFS、不加载内置工具和 Skills, 工具完全由脚本提供,消息历史由脚本端内存管理。 SW 端无状态处理,仅解析 model 配置调用 LLM。
…rompts 实现完整的 MCP (Model Context Protocol) 客户端: - MCPClient: JSON-RPC 2.0 over HTTP POST,Session ID 管理,认证头 - MCPService: 连接池管理,懒连接,MCP 工具自动注册到 ToolRegistry - MCPServerRepo: chrome.storage 持久化服务器配置 - GM API: CAT.agent.mcp(SW + Content 双侧),权限验证 - UI: AgentMcp 页面 — 服务器 CRUD、启用/禁用、测试连接 - 单元测试覆盖 MCPClient、MCPToolExecutor、MCPService
agent_model:__default__ 存储的是默认模型 ID(字符串),被 find() 当作 AgentModelConfig 返回,导致 UI 访问 model.apiKey.length 时报 TypeError。
- 解析 SSE delta 中的 reasoning_content 字段,发出 thinking_delta 事件(兼容 deepseek/o-series) - 将 usage 检查移到 choices 处理之后,修复最后一个 chunk 同时包含 tool_call 增量和 usage 时丢失数据的问题 - Service Worker callLLM() 收集 thinking 内容并持久化到 assistant 消息 - 修复 vitest.config.ts 中重复 exclude 导致 e2e 测试被误执行的问题
* 新增批次检查脚本的 timeout, 避免一个脚本更新时间太长导致所有脚本检查失败 * 🐛 修复批量更新超时机制的 4 个问题 - fetchScriptBody 添加 AbortSignal 支持 - 繁体转简体:確保次序 → 确保顺序 - 用 setTimeout+clearTimeout 替代 sleep,超时后正确清理 - 超时时通过 AbortController 中止进行中的请求 - Map 预初始化确保返回顺序一致 --------- Co-authored-by: 王一之 <yz@ggnb.top>
* additional test for responseType=document * 🐛 修复 脚本设置-授权管理 控制无效的问题 (#1267) * 🐛 修复 脚本设置-授权管理 控制无效的问题 * 将校验逻辑放到confirm * 修复GM cookie权限判断 * 删除directDeny * buildCacheKey * 整理代码 * Update src/app/service/service_worker/permission_verify.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * 🔒 使用 DOMPurify 清理公告通知 HTML 内容 (#1274) * 🔒 使用 DOMPurify 清理公告通知的 HTML 内容 #1273 使用 DOMPurify 对服务端下发的公告 HTML 进行白名单过滤,防止潜在的 UI 注入风险。只允许基础标签和安全的 CSS 属性(颜色、字体相关)。 * code update --------- Co-authored-by: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> * 🐛 修复 include *?* 表达式处理问题 #1271 (#1272) * 🐛 修复 include *?* 表达式处理问题 #1271 * Added error handling to avoid crash * update globSplit * update globSplit * update globSplit --------- Co-authored-by: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> * fix #1274 (#1275) * fix #1274 * Update index.ts * Array.includes -> Set.has * 🐛 修复与隐身窗口检查权限冲突导致反复重启的问题 * 📄 docs: update Chrome Web Store URLs to new domain (#1279) Google migrated the Chrome Web Store from `chrome.google.com/webstore` to `chromewebstore.google.com`. This updates all CWS URLs across README files to use the new domain. The old URLs currently redirect, but will eventually stop working. * ✅ 添加 Playwright E2E 测试及 GM API 功能测试 (#1283) * ✅ 添加 Playwright E2E 测试 - 新增 22 个 E2E 测试覆盖 Options、Popup、Install、Editor、Settings 页面 - 配置 Playwright 使用 --headless=new 模式加载扩展 - 在 CI workflow 中添加 E2E 测试 job * ✅ 添加 GM API E2E 测试 新增 gm-api.spec.ts 测试三类 GM API: - GM_ 同步 API (gm_api_test.js): 29 项测试 - GM.* 异步 API (gm_api_async_test.js): 29 项测试 - Content 注入测试 (inject_content_test.js): 11 项测试 实现要点: - 两阶段浏览器启动:Phase 1 启用 userScriptsAccess,Phase 2 重启运行测试 - 自动审批权限确认弹窗(cookie 等需要用户授权的 API) - 通过剪贴板注入脚本代码到 Monaco 编辑器 - 替换 jsdelivr CDN 为 unpkg 提升资源加载速度 - 去除 @require/@resource 的 SRI hash 避免校验失败 更新 utils.ts 中 installScriptByCode 增加保存失败的 fallback 检测 * 🐛 修复 GM API E2E 测试 CI 兼容性 - Phase 1 添加 --headless=new 参数,修复 CI 无 X server 环境 - 添加 eslint-disable 注释消除 Playwright use() 的误报 - prettier 格式化修正 * 🐛 修复 E2E 测试 CI 兼容性问题 - vitest.config.ts: 排除 e2e/ 目录避免 Vitest 误跑 Playwright 测试 - eslint.config.mjs: 为 e2e/ 目录关闭 react-hooks/rules-of-hooks 规则 - e2e/options.spec.ts: 菜单正则加 /i 标志修复英文环境大小写匹配 - prettier 格式化修正 * 🚑 修复其他扩展注入 chrome.runtime 导致环境误判的问题 #1280 (#1281) * 🐛 修复其他扩展注入 chrome.runtime 导致环境误判的问题 #1280 移除 isContent 运行时检测,改为通过 CustomEventMessage.envTag 在构建入口确定环境, 避免其他扩展(如大学搜题酱)向页面注入 chrome.runtime 对象导致 inject 环境被误判为 content 环境。 * Update src/app/service/content/gm_api/gm_api.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * update * 删除不必要的isconnect * 将 typecheck 集成到 lint/lint-fix 脚本中 * 修复引用 * 删除test-results --------- Co-authored-by: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * ⚙️ 优化 CI 流水线和测试配置 - 缓存 Playwright 浏览器避免重复下载 - 测试失败时上传截图/视频/报告等调试产物 - Playwright CI 环境启用 HTML+list 双 reporter、失败截图和视频 - 各工具链配置屏蔽 .claude 目录 * ✅ 修复 e2e 测试 service worker 超时并优化等待策略 - gm-api.spec.ts: Phase 2 重启 context 后等待 service worker 注册完成 再交给 fixtures,避免 extensionId fixture 用 10s 全局超时等待失败 - gm-api.spec.ts: 用事件驱动 Promise 替换 500ms 轮询循环, console 结果一出现立即继续 - utils.ts: installScriptByCode 用 DOM 事件等待替代固定延迟: click 后等光标出现,粘贴后等 .view-lines 内容变化 --------- Co-authored-by: wangyizhi <yz@ggnb.top> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Michael Lip <51033404+theluckystrike@users.noreply.github.com>
* 优化 MessageConnect 的记忆管理及Cleanup机制 * handler -> cleanup * 次序可推前 * 抛出错误是合理的,不应该屏蔽错误 * Update packages/message/mock_message.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
YouTube视频 不是我所说的效果 应该是Agent看到画面跟代码 例如「加一个按钮切换颜色主题」 不然的话,其他 Cowork什么的 Antigravity 什么的,都能做到吧 |
有道理,不过这个也可以做到,现在我觉得只差想象力了 |
|
我觉得放AI Agent到脚本猫,最重点是,能让用户写UserScript |
- build.yaml/test.yaml 增加 feature/* 分支触发构建和测试 - Agent 错误消息持久化到 OPFS,刷新后仍可见 - 修复主布局全屏溢出问题 - 优化错误消息展示样式,支持暗色主题
- Anthropic API 要求 max_tokens 必传,未配置时默认 16384 - OpenAI 仅在用户配置时传 max_tokens - 模型配置弹窗新增 Max Output Tokens 输入框
- 新增 CAT.agent.model API(list/get/getDefault),隐藏 apiKey - 添加 AgentModelSafeConfig 类型和 ModelApiRequest 类型 - Content/ServiceWorker 两层 GMApi 注册(cat_agent_model.ts / gm_agent_model.ts) - 修复 callLLMWithToolLoop 同一轮多个 tool_call 丢失问题 - 补充 scriptcat.d.ts 类型声明(CATAgentModel namespace) - 完整测试覆盖(100 tests passed)
将 AgentProvider、AgentChat、AgentTasks、AgentMcp 四个 UI 页面从直接 实例化 Repo/Client 改为通过 AgentClient 消息通道调用 SW,与脚本列表的 ScriptClient 模式保持一致。
- ChatInput: 支持粘贴/拖放/文件选择器添加图片,预览缩略图 - ChatArea: 发送前将附件保存到 OPFS - MessageItem: 用户消息渲染图片附件 - OpenAI Provider: 解析 GPT-4o 图片生成响应(数组格式 delta.content) - agent.ts: callLLM 收集生成图片并保存到 OPFS,callLLMWithToolLoop 持久化 ContentBlock[]
- 新增 model_utils 模块:按模型名/URL 自动检测 provider、视觉输入和图片输出能力 - 新增 ProviderIcon 组件:为各 provider 显示对应 SVG 图标 - 模型服务页卡片恢复一排两个布局,修复分组导致每组独占一行的问题 - Anthropic provider 默认 max_tokens 设为 16384 并同步更新测试 - 模型选择器按 provider 分组显示,编辑时恢复已缓存的可用模型列表 - MCP 服务器编辑格式化修正
收紧 supportsImageOutputByModelId 判断条件,排除 gemini-1.5-pro、 gemini-3-flash-preview、gemini-2.0-flash-lite 等不支持图片生成的模型
自动检测可能对未知模型或第三方兼容 API 不准确,新增 supportsVision / supportsImageOutput 字段允许用户在模型编辑中手动覆盖自动检测结果。同时补充 Gemini 3+ image 模型的自动检测规则。
MCPService 改为依赖注入(clientFactory + repo),测试不再依赖 vi.mock; tool_registry 测试移除不可靠的 uuid mock,改为检查 id 非空。
- 新增 enableTools 开关,允许禁用工具调用(图片生成模型场景) - 提取 LLM 回复中 markdown 内联 base64 图片为附件 - MarkdownRenderer 支持 data:image URL、图片点击预览、memo 优化 - ChatInput 增加工具启用/禁用切换按钮
有了解过,我觉得不算是同类型的产品 我的想法并不只是操作浏览器,而是脚本+AI;脚本提供能力,AI提供智慧;有很多的流程并没有完全的打通(或者不好打通),例如编写一篇文章,需要到处去寻找素材,排版,那么就可以用脚本提供能力,AI去指导如何寻找,如何排版 |
将独立的 CATTool/Tools 概念合并进 Skill 系统: - 重命名 CATTool 类型为 SkillScript(CATToolRecord → SkillScriptRecord 等) - 用 execute_skill_script meta-tool 替代动态注册 skillname__toolname 模式 - 删除 CAT.agent.tools GM API,统一到 CAT.agent.skills - 新增 CAT.agent.skills.call() 用于脚本内直接调用 skill script - 删除 CATTool 独立安装流程、UI 页面和相关存储 - 更新 system prompt 描述 execute_skill_script 使用方式
- agent_chat.test.ts: 改用 Object.defineProperty 只 mock navigator.storage, 避免 spread 操作丢失 getter 属性(userAgent)导致 react-dom 初始化崩溃 - agent-fixtures.ts: 重构为单 context 方案,去掉关闭→重启浏览器的两阶段流程, 避免 CI 上 Linux headless Chrome profile 持久化不可靠导致扩展加载失败
- ==CATTool== / ==/CATTool== 头格式改为 ==SkillScript== / ==/SkillScript== - UUID 前缀从 cattool- 改为 skillscript- - .cattool.js 文件扩展名改为 .skill.js - ScriptInfo.cattool 字段改为 skillScript - 变量/函数名中所有 cattool/CATTool 引用统一为 skillScript
- 提取两阶段启动逻辑到 fixtures.ts (testWithUserScripts) - 提取共享工具函数到 utils.ts (patchScriptCode, autoApprovePermissions, runTestScript, runInlineTestScript) - agent-fixtures 在 Phase 1 写入 mock model 配置,修复 Repo enableCache() 导致的 "No model configured" 问题 - 简化 gm-api.spec.ts,复用共享 fixture 和工具函数
新增 8 个开箱即用的内置工具,为 Agent 提供基础能力层: - web_fetch: 抓取网页/JSON,Offscreen DOM 解析提取正文 - web_search: DuckDuckGo HTML 搜索 + Google Custom Search API - ask_user: 向用户提问并等待回复,5 分钟超时 - agent: 启动子代理执行独立子任务,排除 ask_user/agent 防止嵌套 - create_task/get_task/update_task/list_tasks: 会话内任务跟踪 基础设施: - Offscreen HTML 提取器(DOM 解析去骨架 + 搜索结果解析) - 搜索引擎配置 repo(chrome.storage) - ChatStreamEvent 新增 ask_user/sub_agent_event 类型 - System prompt 添加内置工具说明 - AskUserBlock UI 组件(提问展示 + 输入回复)




概述
为 ScriptCat 新增完整的 AI Agent 平台,用户可以通过自然语言对话控制浏览器,自动完成网页操作、定时任务、工具调用等复杂工作流。
构建产物可以从 https://github.com/scriptscat/scriptcat/actions/workflows/build.yaml feature/agent 获取
Youtube 演示
https://www.youtube.com/watch?v=6OT7qeY3Uuk
如果你对此感兴趣,可以加入 Discord 进行交流
核心功能
🤖 AI 对话与多模型支持
🌐 浏览器 DOM 操作
🧩 Skill 技能系统
🔧 CATTool 自定义工具
🔌 MCP 协议支持
⏰ 定时任务调度
📂 OPFS 文件系统
💬 GM API 扩展(脚本侧 Agent API)
CAT.agent.*系列 API,用户脚本可与 Agent 深度交互:CAT.agent.dom— 脚本内调用 DOM 操作CAT.agent.conversation— 管理对话上下文CAT.agent.tools— 动态注册/调用工具CAT.agent.task— 任务生命周期管理UI 页面
技术亮点
数据规模